﻿// Stall Reservations POJ - 3190.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#define _CRT_SECURE_NO_WARNINGS


#include <iostream>
#include <algorithm>
#include <queue>
#include <cstring>
#include <stdio.h>

using namespace std;
//https://vjudge.csgrandeur.cn/problem/POJ-3190

/*
哦，那些挑剔的 N (1 <= N <= 50,000) 头奶牛！
它们太挑剔了，每头奶牛只能在某个精确的时间间隔 A...B（1 <= A <= B <= 1,000,000）内挤奶，这个时间间隔包括 A 和 B 两个时间段。
显然，FJ 必须建立一个预约系统，以确定每头奶牛的挤奶时间可以分配到哪个挤奶台。当然，任何奶牛都不会与其他奶牛分享这种私人时刻。

请帮助 FJ 确定
牛舍中至少需要多少个牛位，以便每头奶牛都能有自己的私人挤奶时间
随着时间的推移，将奶牛分配到这些挤奶台的情况
对于每个测试数据集，许多答案都是正确的；程序将对您的答案进行评分。
输入
第 1 行 一个整数 N

第 2...N+1 行： 第 i+1 行用两个空格分隔的整数描述奶牛 i 的挤奶间隔。
输出
第 1 行 牛舍必须具备的最少牛位数量。

第 2...N+1 行： 第 i+1 行描述奶牛 i 在挤奶期间将被分配到的牛位。

5
1 10
2 4
3 6
5 8
4 7


4
1
2
3
2
4

//测试排序数据
5
1 10
1 9
3 6
5 8
4 7

提示
示例说明：

下面是该输出的图形时间表：

时间 1 2 3 4 5 6 7 8 9 10

牛位 1 c1>>>>>>>>>>>>>>>>>>>>>>>>>>>

牛位 2 ... c2>>>>>> c4>>>>>>>>> ... ...

牛位 3 c3>>>>>>>>> ... ... ... ... ... ...

牛位 4 c5>>>>>>>>> ... ...
也可以使用相同档位数的其他输出。

*/

const int N = 50010;
struct SEG {
    int l, r; int id;
}segs[N];

struct STALL {
    int id,fitime;
};

int cowIDHash[N];

int n;

bool cmp(const struct SEG& a, const struct SEG& b) {
    if (a.l < b.l) return true;
    else if (a.l == b.l) {
        return a.r < b.r;
    }

    return false;
}

struct mycmp {
    bool operator()(const  STALL& a, const  STALL& b)const
    {
        return a.fitime > b.fitime;
    }
};


void solve() {
    int idx = 0; vector<int> ans;
    priority_queue<STALL, vector<STALL>, mycmp> q;
    for (int i = 1; i <= n; i++) {
        if (q.empty() ||  segs[i].l <= q.top().fitime) {
            STALL s; s.id = ++idx; s.fitime = segs[i].r;
            q.push(s);
            cowIDHash[segs[i].id] = s.id;
        }
        else {
            STALL s = q.top(); q.pop();
            s.fitime = segs[i].r;
            q.push(s);
            cowIDHash[segs[i].id] = s.id;
        }
    }

    //cout << idx << endl;
    printf("%d\n",idx);
    for (int i = 1; i <= n; i++) {
        //cout << cowIDHash[i] << endl;
        printf("%d\n", cowIDHash[i]);
    }
}

int main()
{
    while (~scanf("%d",&n) ){
        memset(cowIDHash, 0, sizeof cowIDHash);
        for (int i = 1; i <= n; i++) {
            //cin >> segs[i].l >> segs[i].r;
            scanf("%d%d",&(segs[i].l),&(segs[i].r));
            segs[i].id = i;
        }
        sort(segs+1,segs+1+n,cmp);
        solve();
    }

    return 0;
}

 